//package com.xxl.job.executor.service.jobhandler.backupver;
//
//import com.xxl.job.core.context.XxlJobHelper;
//import com.xxl.job.core.util.GsonTool;
//import com.xxl.job.executor.model.to.FtpParam;
//import com.xxl.job.executor.utils.FileFilterUtil;
//import org.apache.commons.net.ftp.FTPClient;
//import org.apache.commons.net.ftp.FTPFile;
//import org.apache.commons.net.ftp.FTPReply;
//import org.springframework.stereotype.Component;
//
//import java.io.*;
//import java.nio.charset.StandardCharsets;
//import java.util.List;
//
///**
// * XXL-Job FTP文件传输执行器
// * 支持文件上传和下载功能
// */
//@Component
//public class FtpJob_v1 {
//
//    /**
//     * 增强版FTP文件传输任务
//     * 支持按文件名模式、批次号和文件范围筛选下载
//     */
////    @XxlJob("FtpSimpleJob")
//    public void ftpSimpleJobHandler() {
//        String paramJson = XxlJobHelper.getJobParam();
//        if (paramJson == null || paramJson.trim().isEmpty()) {
//            XxlJobHelper.log("参数不能为空，请提供正确的JSON格式参数");
//            return;
//        }
//        paramJson = paramJson.replace("\\", "\\\\");
//        try {
//            // 解析参数
//            FtpParam param = GsonTool.fromJson(paramJson, FtpParam.class);
//            XxlJobHelper.log("开始执行FTP操作: " + param.getOperation());
//            XxlJobHelper.log("服务器: " + param.getHost() + ":" + param.getPort());
//            // 执行FTP操作
//            FTPClient ftpClient = createFtpClient(param);
//            if (ftpClient == null) {
//                // 失败后
//                XxlJobHelper.log("无法连接到FTP服务器");
//                return;
//            }
//            // 成功后
//            boolean success = false;
//            if ("put".equalsIgnoreCase(param.getOperation())) {
//                success = putFilesByRule(ftpClient, param);
//            } else if ("get".equalsIgnoreCase(param.getOperation())) {
//                // 对于下载操作，支持批量按规则下载
//                success = getFilesByRule(ftpClient, param);
//            } else {
//                XxlJobHelper.log("不支持的操作类型: " + param.getOperation());
//            }
//
//            // 处理结果
//            if (success) {
//                XxlJobHelper.log("FTP " + param.getOperation() + " 操作成功");
//            } else {
//                XxlJobHelper.log("FTP " + param.getOperation() + " 操作失败");
//            }
//            // 关闭连接
//            closeFtpClient(ftpClient);
//
//        } catch (Exception e) {
//            XxlJobHelper.log("FTP操作异常: " + e.getMessage());
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 按规则批量下载文件
//     */
//    private boolean getFilesByRule(FTPClient ftpClient, FtpParam param) {
//
//        try {
//            String remotePathString = param.getRemotePath();
//            String localPathString = param.getLocalPath();
//            // 获取远程目录下的所有文件
//            FTPFile[] allFiles = ftpClient.listFiles(remotePathString);
//            if (allFiles == null || allFiles.length == 0) {
//                XxlJobHelper.log("远程目录不存在或为空: " + remotePathString);
//                return false;
//            }
//
//            // 筛选符合条件的文件
//            List<FTPFile> matchedFiles = FileFilterUtil.ftpFileFilter(allFiles, param);
//            if (matchedFiles.isEmpty()) {
//                XxlJobHelper.log("未找到符合条件的文件");
//                return true; // 未找到文件不算失败
//            }
//
//            XxlJobHelper.log("找到 " + matchedFiles.size() + " 个符合条件的文件，开始下载...");
//
//            // 逐个下载文件
//            int successCount = 0;
//            for (FTPFile file : matchedFiles) {
//                // 远程ftp是根目录的，需要不追加/，本地是windows|linux的需要对路径进行设置
//                String remoteFilePath = remotePathString + ("/".equals(remotePathString) ? "" : "/") + file.getName();
//                // 直接使用系统默认文件分隔符
//                String localFilePath = localPathString + File.separator + file.getName();
//                if (getFile(ftpClient, remoteFilePath, localFilePath)) {
//                    successCount++;
//                }
//            }
//
//            XxlJobHelper.log("下载完成，成功: " + successCount + " 个，失败: " + (matchedFiles.size() - successCount) + " 个");
//            return successCount > 0;
//
//        } catch (Exception e) {
//            XxlJobHelper.log("批量下载文件异常: " + e.getMessage());
//            return false;
//        }
//    }
//
//    private boolean putFilesByRule(FTPClient ftpClient, FtpParam param) {
//
//        try {
//            // 获取本地目录下的所有文件
//            String remotePathString = param.getRemotePath();
//            String localPathString = param.getLocalPath();
//
//            File localDir = new File(localPathString);
//            File[] allFiles = localDir.listFiles();
//            if (allFiles == null || allFiles.length == 0) {
//                XxlJobHelper.log("本地目录不存在或为空: " + localPathString);
//                return false;
//            }
//
//            // 筛选符合条件的文件
//            List<File> matchedFiles = FileFilterUtil.fileFilter(allFiles, param);
//            if (matchedFiles.isEmpty()) {
//                XxlJobHelper.log("未找到符合条件的文件");
//                return true; // 未找到文件不算失败
//            }
//
//            XxlJobHelper.log("找到 " + matchedFiles.size() + " 个符合条件的文件，开始上传...");
//
//            // 逐个上传文件
//            int successCount = 0;
//            for (File file : matchedFiles) {
//                // 远程ftp是根目录的，需要不追加/，本地是windows|linux的需要对路径进行设置
//                String remoteFilePath = remotePathString + ("/".equals(remotePathString) ? "" : "/");
//                // 直接使用系统默认文件分隔符
//                String localFilePath = localPathString + File.separator + file.getName();
//                if (putFile(ftpClient, remoteFilePath, localFilePath)) {
//                    successCount++;
//                }
//            }
//
//            XxlJobHelper.log("{}完成，成功: {} 个，失败: {} 个",
//                    param.getOperation(), successCount, matchedFiles.size() - successCount);
//            return successCount > 0;
//
//        } catch (Exception e) {
//            XxlJobHelper.log("批量{}文件异常: {}",
//                    param.getOperation(), e.getMessage());
//            return false;
//        }
//    }
//
//    /**
//     * 下载单个文件
//     */
//    private static boolean getFile(FTPClient ftpClient, String remoteFilePath, String localFilePath) {
//        try {
//            // 创建本地目录
//            File localFile = new File(localFilePath);
//            File localDir = localFile.getParentFile();
//            if (localDir != null && !localDir.exists()) {
//                localDir.mkdirs();
//            }
//
//            // 下载文件
//            try (OutputStream outputStream = new FileOutputStream(localFile)) {
//
//                boolean success = ftpClient.retrieveFile(remoteFilePath, outputStream);
//                if (success) {
//                    XxlJobHelper.log("文件下载成功: " + remoteFilePath + " -> " + localFile.getAbsolutePath());
//                    return true;
//                } else {
//                    XxlJobHelper.log("文件下载失败: " + remoteFilePath + ", 服务器响应: " + ftpClient.getReplyString());
//                    // 清理空文件
//                    if (localFile.exists()) {
//                        localFile.delete();
//                    }
//                    return false;
//                }
//            }
//
//        } catch (Exception e) {
//            XxlJobHelper.log("下载文件异常 " + remoteFilePath + ": " + e.getMessage());
//            return false;
//        }
//    }
//
//    /**
//     * 上传单个文件
//     */
//    private static boolean putFile(FTPClient ftpClient, String remoteFilePath, String localFilePath) {
//
//        try {
//            File localFile = new File(localFilePath);
//            if (!localFile.exists() || !localFile.isFile()) {
//                XxlJobHelper.log("本地文件不存在或不是文件: " + localFilePath);
//                return false;
//            }
//
//            // 创建远程目录
//            if (remoteFilePath != null && !ftpClient.changeWorkingDirectory(remoteFilePath)) {
//                boolean dirCreated = createRemoteDirectory(ftpClient, remoteFilePath);
//                if (!dirCreated) {
//                    XxlJobHelper.log("无法创建远程目录: " + remoteFilePath);
//                    return false;
//                }
//            }
//
//            // 上传文件
//            String remoteFileName = new File(localFilePath).getName();
//            try (InputStream inputStream = new FileInputStream(localFile)) {
//                boolean success = ftpClient.storeFile(remoteFileName, inputStream);
//                if (success) {
//                    XxlJobHelper.log("文件上传成功: " + localFile.getName() + " -> " + remoteFilePath);
//                    return true;
//                } else {
//                    XxlJobHelper.log("文件上传失败，服务器响应: " + ftpClient.getReplyString());
//                    return false;
//                }
//            }
//        } catch (Exception e) {
//            XxlJobHelper.log("文件上传异常: " + e.getMessage());
//            return false;
//        }
//    }
//
//    // ------------------------------ FTP连接管理 ------------------------------
//
//    /**
//     * 创建FTP客户端
//     *
//     * @param param ftp参数
//     * @return FTP客户端
//     */
//    private static FTPClient createFtpClient(FtpParam param) {
//        FTPClient ftpClient = new FTPClient();
//        try {
//            ftpClient.connect(param.getHost(), param.getPort());
//            int replyCode = ftpClient.getReplyCode();
//            if (!FTPReply.isPositiveCompletion(replyCode)) {
//                XxlJobHelper.log("FTP服务器拒绝连接，响应码: " + replyCode);
//                ftpClient.disconnect();
//                return null;
//            }
//
//            if (!ftpClient.login(param.getUsername(), param.getPassword())) {
//                XxlJobHelper.log("FTP登录失败");
//                ftpClient.disconnect();
//                return null;
//            }
//
//            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//            ftpClient.setControlEncoding(StandardCharsets.UTF_8.name());
//            ftpClient.enterLocalPassiveMode();
//
//            return ftpClient;
//        } catch (Exception e) {
//            XxlJobHelper.log("创建FTP连接失败: " + e.getMessage());
//            closeFtpClient(ftpClient);
//            return null;
//        }
//    }
//
//    /**
//     * 创建远程目录
//     *
//     * @param ftpClient ftp客户端
//     * @param remoteDir 远程目录
//     * @return 创建成功
//     * @throws IOException IO异常
//     */
//    private static boolean createRemoteDirectory(FTPClient ftpClient, String remoteDir) throws IOException {
//        String[] dirs = remoteDir.split("/");
//        String currentDir = "";
//
//        for (String dir : dirs) {
//            if (dir.isEmpty()) continue;
//
//            currentDir += "/" + dir;
//            if (!ftpClient.changeWorkingDirectory(currentDir)) {
//                if (!ftpClient.makeDirectory(currentDir)) {
//                    return false;
//                }
//                ftpClient.changeWorkingDirectory(currentDir);
//            }
//        }
//        return true;
//    }
//
//    /**
//     * 关闭FTP连接
//     *
//     * @param ftpClient ftp客户端
//     */
//    private static void closeFtpClient(FTPClient ftpClient) {
//        try {
//            if (ftpClient != null && ftpClient.isConnected()) {
//                ftpClient.logout();
//                ftpClient.disconnect();
//            }
//        } catch (IOException e) {
//            XxlJobHelper.log("关闭FTP连接时出错: " + e.getMessage());
//        }
//    }
//}
